package com.gather.collections;

import java.util.*;

public class Example01 {
    public static void main(String[] args) {
        System.out.println("Collections工具类的学习");
        List<Integer> list = new ArrayList<>();
        list.add(20);
        list.add(10);
        list.add(37);
        list.add(21);
        list.add(1);
        // 排序前
        System.out.println("排序之前："+list); //[20, 10, 37, 21, 1]
        // 排序 sort()
        Collections.sort(list);
        System.out.println("排序之后："+list); // [1, 10, 20, 21, 37]
        // 自定义排序
        //Collections.sort(list, new Comparator<Integer>() {
        //    @Override
        //    public int compare(Integer o1, Integer o2) {
        //        if(o1.equals(o2)) {
        //            return 0;
        //        }
        //        // 大到小排
        //        return (o1 > o2 ) ? -1 : 1;
        //    }
        //});
        // 这种写法等等同于上面
        Collections.sort(list, (o1, o2) -> {
            if(o1.equals(o2)) {
                return 0;
            }
            return (o1 > o2 ) ? -1 : 1; // 大到小排
        });
        System.out.println("排序之后："+list); // [37, 21, 20, 10, 1]
        /**
         * 二叉树查找 （一定要先排序，再二叉树查找）
         * binarySearch（）
         * 找到：返回所在位置
         * 找不到返回负数
         */
        System.out.println("-----二叉树----");
        int i = Collections.binarySearch(list, 20);
        System.out.println(i); // 2
        int i1 = Collections.binarySearch(list, 40);
        System.out.println(i1); // -6
        /**
         * void reverse() 反转集合中元素的顺序
         * void shuffle() 随机重置集合中元素的顺序
         */
        System.out.println("------------");
        Collections.reverse(list);
        System.out.println(list);// [1, 10, 20, 21, 37]
        Collections.shuffle(list);
        System.out.println(list); //[21, 10, 1, 20, 37]
        /**
         * obj.toArray(new 数据类型[])   集合转数组
         * Arrays.asList(arr 数组类型[]) 数组转集合
         */
        System.out.println("---- 集合转数组 -----");
        ArrayList<String> strList = new ArrayList<>();
        strList.add("a");
        strList.add("b");
        strList.add("c");
        System.out.println(strList); // [a, b, c]
        // 集合转数组 new String[length] length 长度任意填写
        String[] strings = strList.toArray(new String[strList.size()]);
        System.out.println("数组的长度："+strings.length);
        System.out.println(Arrays.toString(strings));
        // 数组转集合
        String[] arr = {"张三","李四","王五"};
        List<String> stringsList = Arrays.asList(arr);
        System.out.println("集合长度："+stringsList.size());
        System.out.println(stringsList);
        // 添加操作 -- 无法添加，是一个受限的集合，不能添加和删除
        //stringsList.add("赵六");
        /**
         * unmodifiableList（）转为不可变集合，不允许添加修改操作
         */
        List<String> mutable = new ArrayList<>();
        mutable.add("apple");
        mutable.add("pear");
        // 变为不可变集合:
        List<String> immutable = Collections.unmodifiableList(mutable);
        //immutable.add("orange"); // UnsupportedOperationException!
        /**
         * 原始数组可以添加修改
         */
        mutable.add("orange");
        System.out.println(mutable);
        /**
         * 如果希望不原始数组被改变 那么需要立刻扔掉 赋值为 null
         */
        mutable = null;
    }
}
